package main

import (
	"fmt"
	"time"
)

//并发:同时处理多个任务的能力(一个处理器)
// 并行:同时执行多个任务的能力(多个处理器)

/*
线程(Thread)是计算机操作系统中程序运行时最小的执行单元是CPU调度的基本单元。
一个线程可以理解为一个任务，都具有一个独立的控制流

在多线程编程中，可以将不同的任务或操作封装在不同的线程中，
然后并发地执行这些任务，从而提高程序的性能和响应速度。

协程(Coroutine)是一种轻量级的线程，也被称为用户态线程。与操作系统中的线程不同，
协程由程序员自己管理调度。协程可以使用更少的资源，
更快的创建和销毁协程之间可以通过通道(Channel)进行通信和同步，
避免了传统线程中锁等同步机制的开销和复杂性。

go语言中协程的实现是通过goroutine实现的。

*/

func makeBuns(filling string) {
	startTime := time.Now()
	fmt.Printf("开始做%s馅的包子\n", filling)
	fmt.Printf("开始剁%s馅的包子\n", filling)
	fmt.Printf("开始擀%s馅的包子\n", filling)
	fmt.Printf("开始蒸%s馅的包子\n", filling)
	endTime := time.Since(startTime)
	fmt.Printf("耗时：%s馅,%s", filling, endTime)

}
func main() {
	//协程 go关键字启动一个协程
	//协程： 2KB 的栈空间， 1000个协程占用2MB内存  线程：8MB的栈空间，1000个线程占用8GB内存
	// 不需要关心协程的底层逻辑、内存管理以及垃圾回收 go语言底层已经封装好了
	fillings := []string{"猪肉", "牛肉", "鸡肉"}

	for _, v := range fillings {
		go makeBuns(v)
		//主程序不会等待协程执行完毕，直接往下执行

	}
	time.Sleep(time.Second * 10)

}
